/**
 * 作用域：
 *      作用域指一个变量的作用范围，在JS中一共有两种作用域：
 *          1. 全局作用域
 *              直接在编写在script标签中的JS代码，都在全局作用域中
 *              全局作用域在页面打开时创建，在页面关闭时销毁。
 *              在我们全局作用域中，有一个全局对象：window，我们可以直接使用
 *              window由我们的浏览器创建，代表一个浏览器窗口。
 *              在全局作用域中：
 *                  创建的变量都会作为window对象的属性保存
 *                  创建的函数都会作为window对象的方法保存，我们平时所说的函数就是window对象的方法。
 *
 *              全局作用域中的变量都是全局的变量，在页面的任意的部分都可以访问到
 *
 *             变量的声明提前：
 *                  使用var关键字声明的变量，会在所有的代码执行之前被声明（但是不会被赋值）,但是如果声明变量时不使用var关键字，则变量不会被声明提前。
 *             函数的声明提前：
 *                  使用函数声明形式创建的函数function 函数(){},它会在所有的代码执行之前被创建，所以我们可以在函数声明前来调用该函数
 *                  使用函数表达式创建的函数var 函数名 = function(){}, 不会被声明提前，所有不能再声明前调用
 *          2. 函数作用域
 *              调用函数时创建函数作用域，函数执行完毕以后，函数作用域销毁
 *              每调用一次函数就会创建一个新的函数作用域，他们之间是相互独立的
 *              在函数作用域中可以访问到全局作用域的变量；但是在全局作用域中无法访问到函数作用域的变量。
 *
 *              当在函数作用域中操作一个变量时，它会先在自身的作用域中寻找，如果有就直接使用，如果没有则会向上一级去寻找，直到找到全局作用域，如果全局作用域中依然没有，则会报错。
 *              在函数中要访问全局变量可以使用window对象
 *
 *              在函数作用域中也有声明提前的特性，使用var关键字声明变量，会在函数中所有的代码执行之前被声明
 *              函数声明也会在函数中所有的代码执行之前执行
 *
 *              在函数中，不使用var声明的变量都会成为全局变量
 *
 *  this:
 *      解析器在调用函数每次都会向函数内部传递一个隐含的参数，这个隐含的参数就是this，this指向的是一个对象，这个对象我们称之函数执行的上下文对象，根据函数调用方式的不同，this会指向不同的对象
 *      1. 以函数的形式调用时，this永远都是window
 *      2. 以方法的形式调用时，this就是调用方法的对象
 *
 *
 * */

function fun() {
    console.log(this);
}
/**以函数的形式调用*/
// fun();

var obj = {
    name:"孙悟空",
    age:fun
};

/**以方法的形式调用*/
obj.age();